home *** CD-ROM | disk | FTP | other *** search
/ The Mac 1996 October / The Mac (October 1996).dmg / Web Authoring / WebStat 2.3.4DB Folder / TCPLib.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-17  |  4.0 KB  |  204 lines  |  [TEXT/KAHL]

  1. /*
  2.  * File:        TCPLib.c
  3.  *
  4.  * Parts of this code are (c) Copyright 1988 by Apple Computer.  All rights reserved
  5.  */
  6.  
  7. #include "TCPLib.h"
  8. #include <String.h>
  9. #include <Sioux.h>
  10.  
  11. #define OPENRESOLVER    1L
  12. #define CLOSERESOLVER    2L
  13. #define STRTOADDR        3L
  14. #define    ADDRTOSTR        4L
  15. #define    ENUMCACHE        5L
  16. #define ADDRTONAME        6L
  17.  
  18. short refNum;
  19. OSErrProcPtr dnr = 0L;
  20. Handle codeHndl = 0L;
  21.  
  22. /* OpenOurRF is called to open the MacTCP driver resources */
  23.  
  24. short OpenOurRF(void)
  25. {
  26.     SysEnvRec info;
  27.     HParamBlockRec fi;
  28.     Str255 filename;
  29.  
  30.     SysEnvirons(1, &info);
  31.  
  32.     fi.fileParam.ioCompletion = 0L;
  33.     fi.fileParam.ioNamePtr = filename;
  34.     fi.fileParam.ioVRefNum = info.sysVRefNum;
  35.     fi.fileParam.ioDirID = 0;
  36.     fi.fileParam.ioFDirIndex = 1;
  37.     
  38.     while (PBHGetFInfo(&fi, false) == noErr) {
  39.         /* scan system folder for driver resource files of specific type & creator */
  40.         if (fi.fileParam.ioFlFndrInfo.fdType == 'cdev' &&
  41.             fi.fileParam.ioFlFndrInfo.fdCreator == 'mtcp') {
  42.             /* found the MacTCP driver file */
  43.             SetVol(0,info.sysVRefNum);
  44.             return(OpenResFile(filename));
  45.             }
  46.         /* check next file in system folder */
  47.         fi.fileParam.ioFDirIndex++;
  48.         fi.fileParam.ioDirID = 0;
  49.         }
  50.     return(-1);
  51.     }    
  52.  
  53.  
  54. OSErr OpenResolver(fileName)
  55. char *fileName;
  56. {
  57.     short refnum;
  58.     OSErr rc;
  59.     
  60.     if (dnr != 0L)
  61.         /* resolver already loaded in */
  62.         return(noErr);
  63.         
  64.     /* open the MacTCP driver to get DNR resources. Search for it based on
  65.        creator & type rather than simply file name */    
  66.     refnum = OpenOurRF();
  67.  
  68.     /* ignore failures since the resource may have been installed in the 
  69.        System file if running on a Mac 512Ke */
  70.        
  71.     /* load in the DNR resource package */
  72.     codeHndl = GetIndResource('dnrp', 1);
  73.     if (codeHndl == 0L) {
  74.         /* can't open DNR */
  75.         return(ResError());
  76.         }
  77.     
  78.     DetachResource(codeHndl);
  79.     if (refnum != -1) {
  80.         CloseResFile(refnum);
  81.         }
  82.         
  83.     /* lock the DNR resource since it cannot be reloated while opened */
  84.     HLock(codeHndl);
  85.     dnr = (OSErrProcPtr) *codeHndl;
  86.     
  87.     /* call open resolver */
  88.     rc = (*dnr)(OPENRESOLVER, fileName);
  89.     if (rc != noErr) {
  90.         /* problem with open resolver, flush it */
  91.         HUnlock(codeHndl);
  92.         DisposHandle(codeHndl);
  93.         dnr = 0L;
  94.         }
  95.     return(rc);
  96.     }
  97.  
  98.  
  99. OSErr CloseResolver(void)
  100. {
  101.     if (dnr == 0L)
  102.         /* resolver not loaded error */
  103.         return(notOpenErr);
  104.         
  105.     /* call close resolver */
  106.     (void) (*dnr)(CLOSERESOLVER);
  107.  
  108.     /* release the DNR resource package */
  109.     HUnlock(codeHndl);
  110.     DisposHandle(codeHndl);
  111.     dnr = 0L;
  112.     return(noErr);
  113.     }
  114.  
  115. OSErr AddrToStr(addr, addrStr)
  116. unsigned long addr;
  117. char *addrStr;                                    
  118. {
  119.     if (dnr == 0L)
  120.         /* resolver not loaded error */
  121.         return(notOpenErr);
  122.         
  123.     (*dnr)(ADDRTOSTR, addr, addrStr);
  124.     return(noErr);
  125.     }
  126.     
  127.  
  128. OSErr OpenTCPDriver()
  129. {
  130.     OSErr    err;
  131.     
  132.     err = OpenDriver("\p.IPP",&refNum);
  133.     return(err);
  134. }
  135.  
  136. OSErr InitNetwork(void)
  137. {
  138.     return OpenTCPDriver();
  139. }
  140.  
  141. static pascal void DNRResultProc (struct hostInfo *hInfoPtr, char *userDataPtr)
  142. {
  143.     *(Boolean*)userDataPtr = true;
  144. }
  145.  
  146. long GiveTime(long x)
  147. {
  148.     unsigned long    finalTicks;
  149.     extern void        HandleEvents();
  150.     
  151.     finalTicks = TickCount() + x;
  152.     
  153.     do {
  154.         HandleEvents();
  155.     } while (TickCount() < finalTicks);
  156.  
  157.     return(finalTicks);
  158. }
  159.  
  160. OSErr AddrToName(addr, rtnStruct, resultproc, userDataPtr)
  161. unsigned long addr;
  162. struct hostInfo *rtnStruct;
  163. ResultProcPtr resultproc;
  164. char *userDataPtr;                                    
  165. {
  166.     if (dnr == 0L)
  167.         /* resolver not loaded error */
  168.         return(notOpenErr);
  169.         
  170.     return((*dnr)(ADDRTONAME, addr, rtnStruct, resultproc, userDataPtr));
  171.     }
  172.     
  173.  
  174. /*    LowIPAddrToName invokes the domain name system to translate an IP address
  175.     into a domain name. */
  176.     
  177. OSErr LowIPAddrToName (unsigned long addr, char *name)
  178. {
  179.     struct hostInfo hInfo;
  180.     OSErr err;
  181.     Boolean done=false;
  182.     
  183.     if ((err = OpenResolver(nil)) != noErr) return err;
  184.     err = AddrToName(addr, &hInfo, DNRResultProc, (char*)&done);
  185.     if (err == cacheFault) {
  186.         while (!done) GiveTime(1L);
  187.         err = hInfo.rtnCode;
  188.     }
  189.     CloseResolver();
  190.     hInfo.cname[254] = 0;
  191.     strcpy(name,hInfo.cname);
  192.     return err;
  193. }
  194.  
  195. /*    IPAddrToName invokes the domain name system to translate an IP address
  196.     into a domain name. */
  197.     
  198. OSErr IPAddrToName (unsigned long addr, char *name)
  199. {
  200.     return LowIPAddrToName(addr, name);
  201. }
  202.  
  203.  
  204.